import 'dart:io';
import 'dart:typed_data';

class SaveFile {
  /// 传入图片字节数组，返回图片格式（jpg/png/gif/webp）
  static String getImageFormatFromBytes(Uint8List cacheData) {
    // 1. 校验字节数组长度（至少满足最小格式的特征码长度）
    if (cacheData.length < 8) {
      // 最短的 GIF 特征码需要6字节，PNG需要8字节，这里取8字节保底
      return 'unknown';
    }

    // 2. 读取前8字节（覆盖所有常见格式的特征码长度）
    final List<int> header = cacheData.sublist(0, 8); // 取前8字节用于判断

    // 3. 对比特征码判断格式
    // 判断 JPG/JPEG（前3字节：FF D8 FF）
    if (header[0] == 255 && header[1] == 216 && header[2] == 255) {
      return 'jpg';
    }
    // 判断 PNG（前8字节：89 50 4E 47 0D 0A 1A 0A）
    else if (header[0] == 137 &&
        header[1] == 80 &&
        header[2] == 78 &&
        header[3] == 71 &&
        header[4] == 13 &&
        header[5] == 10 &&
        header[6] == 26 &&
        header[7] == 10) {
      return 'png';
    }
    // 判断 GIF（前6字节：GIF87a 或 GIF89a）
    else if (header[0] == 71 &&
        header[1] == 73 &&
        header[2] == 70 &&
        header[3] == 56) {
      if (header[4] == 55 && header[5] == 97) return 'gif'; // GIF87a
      if (header[4] == 57 && header[5] == 97) return 'gif'; // GIF89a
    }
    // 判断 WebP（前4字节 RIFF + 后续包含 WEBP，前8字节需满足：RIFF....WEBP 的前半部分）
    else if (header[0] == 82 &&
        header[1] == 73 &&
        header[2] == 70 &&
        header[3] == 70 &&
        header[4] != 0 &&
        header[5] != 0 &&
        header[6] != 0 &&
        header[7] != 0) {
      // WebP 完整特征：前4字节 RIFF + 4字节长度 + 4字节 WEBP，这里简化判断前4字节+第8字节后是否包含 WEBP
      // 进一步校验：取第8-11字节（RIFF 后第4-7字节）是否为 WEBP（87 69 66 80）
      if (cacheData.length >= 12) {
        // 确保有足够字节判断
        final List<int> webpHeader = cacheData.sublist(8, 12);
        if (webpHeader[0] == 87 &&
            webpHeader[1] == 69 &&
            webpHeader[2] == 66 &&
            webpHeader[3] == 80) {
          return 'webp';
        }
      }
    }

    // 4. 未匹配任何已知格式 默认返回 jpg
    return 'jpg';
  }

  // 保存文件本地文件复制到 D盘 BoQiDown 文件夹
  static Future<String> saveImageFile(String path) async {
    try {
      // 确保 D盘 BoQiDown 文件夹存在
      Directory directory = Directory('D:\\BoQiDown\\image');
      if (!directory.existsSync()) {
        try {
          directory.createSync(recursive: true); // 递归创建
        } catch (e) {
          print('创建文件夹失败: $e');
          rethrow;
        }
      }
      // 复制文件到 D盘 BoQiDown 文件夹
      File file = File(path);
      // 判断文件后缀
      String suffix = getImageFormatFromBytes(file.readAsBytesSync());
      String newPath =
          'D:\\BoQiDown\\image\\${file.path.split('\\').last.split('.')[0]}.$suffix';
      await file.copy(newPath);
      return newPath; // 返回新的路径
    } catch (e) {
      throw Exception('保存文件失败: $e');
    }
  }

  static Future<String> saveVideoFile(String path) async {
    try {
      // 确保 D盘 BoQiDown 文件夹存在
      Directory directory = Directory('D:\\BoQiDown\\video');
      if (!directory.existsSync()) {
        try {
          directory.createSync(recursive: true); // 递归创建
        } catch (e) {
          print('创建文件夹失败: $e');
          rethrow;
        }
      }
      // 复制文件到 D盘 BoQiDown 文件夹
      File file = File(path);
      String newPath = 'D:\\BoQiDown\\video\\${file.path.split('\\').last}';
      await file.copy(newPath);
      return newPath; // 返回新的路径
    } catch (e) {
      throw Exception('保存文件失败: $e');
    }
  }

  static Future<String> saveFileWallPaper(String path) async {
    try {
      // 确保 D盘 BoQiDown 文件夹存在
      Directory directory = Directory('D:\\BoQiDown\\image');
      if (!directory.existsSync()) {
        try {
          directory.createSync(recursive: true); // 递归创建
        } catch (e) {
          print('创建文件夹失败: $e');
          rethrow;
        }
      }
      // 复制文件到 D盘 BoQiDown 文件夹
      File file = File(path);
      String newPath = 'D:\\BoQiDown\\image\\desktop.jpg';
      await file.copy(newPath);
      return newPath; // 返回新的路径
    } catch (e) {
      throw Exception('保存文件失败: $e');
    }
  }
}
